home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
xearth-0.92
/
resources.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-25
|
6KB
|
223 lines
/*
* resources.c
* march 1994
*
* RCS $Id: resources.c,v 1.6 1994/05/20 01:37:40 tuna Exp $
*
* this file is copied essentially verbatim from the sources for Jamie
* Zawinski's xscreensaver package; his original copyright notice
* follows this comment.
*/
/* xscreensaver, Copyright (c) 1992 Jamie Zawinski <jwz@lucid.com>
*
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without
* fee, provided that the above copyright notice appear in all copies
* and that both that copyright notice and this permission notice
* appear in supporting documentation. No representations are made
* about the suitability of this software for any purpose. It is
* provided "as is" without express or implied warranty.
*/
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xresource.h>
/* Resource functions. Assumes: */
extern char *progname;
extern char *progclass;
extern XrmDatabase db;
#ifndef isupper
# define isupper(c) ((c) >= 'A' && (c) <= 'Z')
#endif
#ifndef _tolower
# define _tolower(c) ((c) - 'A' + 'a')
#endif
char *
get_string_resource (res_name, res_class)
char *res_name, *res_class;
{
XrmValue value;
char *type;
char full_name [1024], full_class [1024];
strcpy (full_name, progname);
strcat (full_name, ".");
strcat (full_name, res_name);
strcpy (full_class, progclass);
strcat (full_class, ".");
strcat (full_class, res_class);
if (XrmGetResource (db, full_name, full_class, &type, &value))
{
char *str = (char *) malloc ((unsigned) value.size + 1);
strncpy (str, (char *) value.addr, value.size);
str [value.size] = 0;
return str;
}
return 0;
}
int
get_boolean_resource (res_name, res_class)
char *res_name, *res_class;
{
char *tmp, buf [100];
char *s = get_string_resource (res_name, res_class);
char *os = s;
if (! s) return 0;
for (tmp = buf; *s; s++)
*tmp++ = isupper (*s) ? _tolower (*s) : *s;
*tmp = 0;
free (os);
if (!strcmp (buf, "on") || !strcmp (buf, "true") || !strcmp (buf, "yes"))
return 1;
if (!strcmp (buf,"off") || !strcmp (buf, "false") || !strcmp (buf,"no"))
return 0;
fprintf (stderr, "%s: %s must be boolean, not %s.\n",
progname, res_class, buf);
return 0;
}
int
get_integer_resource (res_name, res_class)
char *res_name, *res_class;
{
int val;
char c, *s = get_string_resource (res_name, res_class);
if (!s) return 0;
if (1 == sscanf (s, " %d %c", &val, &c))
{
free (s);
return val;
}
fprintf (stderr, "%s: %s must be an integer, not %s.\n",
progname, res_name, s);
free (s);
return 0;
}
double
get_float_resource (res_name, res_class)
char *res_name, *res_class;
{
double val;
char c, *s = get_string_resource (res_name, res_class);
if (! s) return 0.0;
if (1 == sscanf (s, " %lf %c", &val, &c))
{
free (s);
return val;
}
fprintf (stderr, "%s: %s must be a float, not %s.\n",
progname, res_name, s);
free (s);
return 0.0;
}
unsigned int
get_pixel_resource (res_name, res_class, dpy, cmap)
char *res_name, *res_class;
Display *dpy;
Colormap cmap;
{
XColor color;
char *s = get_string_resource (res_name, res_class);
if (!s) goto DEFAULT;
if (! XParseColor (dpy, cmap, s, &color))
{
fprintf (stderr, "%s: can't parse color %s\n", progname, s);
goto DEFAULT;
}
if (! XAllocColor (dpy, cmap, &color))
{
fprintf (stderr, "%s: couldn't allocate color %s\n", progname, s);
goto DEFAULT;
}
free (s);
return color.pixel;
DEFAULT:
if (s) free (s);
return (strcmp (res_class, "Background")
? WhitePixel (dpy, DefaultScreen (dpy))
: BlackPixel (dpy, DefaultScreen (dpy)));
}
int
parse_time (string, seconds_default_p, silent_p)
char *string;
Bool seconds_default_p, silent_p;
{
unsigned int h, m, s;
char c;
if (3 == sscanf (string, " %u : %2u : %2u %c", &h, &m, &s, &c))
;
else if (2 == sscanf (string, " : %2u : %2u %c", &m, &s, &c) ||
2 == sscanf (string, " %u : %2u %c", &m, &s, &c))
h = 0;
else if (1 == sscanf (string, " : %2u %c", &s, &c))
h = m = 0;
else if (1 == sscanf (string, " %u %c",
(seconds_default_p ? &s : &m), &c))
{
h = 0;
if (seconds_default_p) m = 0;
else s = 0;
}
else
{
if (! silent_p)
fprintf (stderr, "%s: invalid time interval specification \"%s\".\n",
progname, string);
return -1;
}
if (s >= 60 && (h != 0 || m != 0))
{
if (! silent_p)
fprintf (stderr, "%s: seconds > 59 in \"%s\".\n", progname, string);
return -1;
}
if (m >= 60 && h > 0)
{
if (! silent_p)
fprintf (stderr, "%s: minutes > 59 in \"%s\".\n", progname, string);
return -1;
}
return ((h * 60 * 60) + (m * 60) + s);
}
static unsigned int
get_time_resource (res_name, res_class, sec_p)
char *res_name, *res_class;
Bool sec_p;
{
int val;
char *s = get_string_resource (res_name, res_class);
if (!s) return 0;
val = parse_time (s, sec_p, False);
free (s);
return (val < 0 ? 0 : val);
}
unsigned int
get_seconds_resource (res_name, res_class)
char *res_name, *res_class;
{
return get_time_resource (res_name, res_class, True);
}
unsigned int
get_minutes_resource (res_name, res_class)
char *res_name, *res_class;
{
return get_time_resource (res_name, res_class, False);
}